"""
数据库 工具类的 设计封装
"""
import pymysql


# 创建数据库工具类, 添加常用方法。
class DBUtil(object):
    # 创建 类属性（相当于 类内部的 "全局变量"）
    conn = None  # 默认值为 空

    # 获取连接 -- 设置为 私有方法。在本类内可以正常使用。 类外 此方法不可见。
    @classmethod  # 设置为 类方法，使用更简单
    def __get_conn(cls):
        if cls.conn is None:  # if成立，conn并未创建
            cls.conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
                                       password="iHRM_student_2021", database="ihrm",
                                       charset="utf8")

        return cls.conn  # 返回的一定是非空的 conn。 这个 return 千万 不能写到 if 内。

    # 关闭连接 -- 设置为 私有方法。在本类内可以正常使用。 类外 此方法不可见。
    @classmethod  # 设置为 类方法，使用更简单
    def __close_conn(cls):
        # 判断是否为空。不为空，就关闭。 如果为空，没必要再关闭。
        if cls.conn is not None:
            cls.conn.close()  # 关闭 类属性 conn
            cls.conn = None  # 将 关闭后的代码 置空。

    # 查询 一条记录
    @classmethod  # 设置为 类方法，使用更简单
    def get_one(cls, sql):  # sql : 可以让用户指定查询 sql
        cursor = None
        try:
            # 1. 获取连接(调用 __get_conn)。创建游标
            cursor = DBUtil.__get_conn().cursor()  # 这一行，等同于下面的两行。

            # 2. 执行 查询语句 execute("查询SQL")
            cursor.execute(sql)

            # 3. 提取 查询结果中的 1条记录。
            res = cursor.fetchone()
            return res
        except Exception as err:
            print("查询 sql 出现异常：", str(err))
        finally:
            cursor.close()
            cls.__close_conn()

    # 增删改 记录，update/insert/delete --- uid
    @classmethod  # 设置为 类方法，使用更简单
    def uid_db(cls, sql):
        cursor = None  # 定义方法内，都能使用的 cursor 变量即可。
        try:
            # 1. 获取连接，创建游标
            cursor = DBUtil.__get_conn().cursor()
            # 2. 执行 sql 语句。（增删改 语法）
            cursor.execute(sql)
            # 3. 成功，提交 事务。
            cls.conn.commit()
        except Exception as err:
            print("增删改 sql 出现异常：", str(err))
            # 失败，回滚事务
            cls.conn.rollback()
        finally:
            cursor.close()
            cls.__close_conn()


if __name__ == '__main__':
    # 测试 使用 工具方法
    # res = DBUtil.get_one("select * from t_book where id = 420;")
    # print("SQL 语句执行结果：", res)

    # 测试 工具 方法 --- 增删改
    # DBUtil.uid_db("update t_book set `read` = `read` + 1 where title = '哈哈哈哈';")
    DBUtil.uid_db("delete from t_book where title = '哈哈哈哈';")
